package cn.iocoder.yudao.module.reading.service.assignment;

import cn.iocoder.yudao.module.reading.controller.app.assignment.vo.*;
import cn.iocoder.yudao.module.reading.dal.dataobject.assignment.ClassAssignmentDO;

import java.util.List;

/**
 * 班级作业管理 Service 接口
 *
 * @author 芋道源码
 */
public interface AssignmentService {

    // =============================================
    // 作业管理
    // =============================================

    /**
     * 获取班级作业列表
     *
     * @param classId 班级ID
     * @param userId  当前用户ID
     * @return 作业列表
     */
    List<AssignmentRespVO> getClassAssignments(Long classId, Long userId);

    /**
     * 获取作业详细信息
     *
     * @param assignmentId 作业ID
     * @param userId       当前用户ID
     * @return 作业详情
     */
    AssignmentRespVO getAssignmentDetail(Long assignmentId, Long userId);

    /**
     * 创建班级作业
     *
     * @param userId      创建者ID
     * @param createReqVO 创建信息
     * @return 作业ID
     */
    Long createAssignment(Long userId, AssignmentCreateReqVO createReqVO);

    /**
     * 创建跨班级作业
     *
     * @param userId      创建者ID
     * @param createReqVO 创建信息
     * @return 作业ID列表
     */
    List<Long> createMultiClassAssignment(Long userId, AssignmentCreateReqVO createReqVO);

    /**
     * 获取用户在多个班级中的作业列表
     *
     * @param userId   用户ID
     * @param classIds 班级ID列表
     * @return 作业列表
     */
    List<AssignmentRespVO> getMultiClassAssignments(Long userId, List<Long> classIds);

    /**
     * 修改作业信息
     *
     * @param assignmentId 作业ID
     * @param userId       操作用户ID
     * @param updateReqVO  更新信息
     */
    void updateAssignment(Long assignmentId, Long userId, AssignmentUpdateReqVO updateReqVO);

    /**
     * 删除作业
     *
     * @param assignmentId 作业ID
     * @param userId       操作用户ID
     */
    void deleteAssignment(Long assignmentId, Long userId);

    // =============================================
    // 作业完成管理
    // =============================================

    /**
     * 获取作业完成情况
     *
     * @param assignmentId 作业ID
     * @param userId       当前用户ID
     * @return 完成记录列表
     */
    List<AssignmentCompletionRespVO> getAssignmentCompletions(Long assignmentId, Long userId);

    /**
     * 提交作业完成记录
     *
     * @param assignmentId  作业ID
     * @param userId        用户ID
     * @param completeReqVO 完成信息
     */
    void completeAssignment(Long assignmentId, Long userId, AssignmentCompleteReqVO completeReqVO);

    /**
     * 获取作业完成统计
     *
     * @param assignmentId 作业ID
     * @param userId       当前用户ID
     * @return 完成统计
     */
    AssignmentStatsRespVO getAssignmentStats(Long assignmentId, Long userId);

    // =============================================
    // 绘本选择
    // =============================================

    /**
     * 获取可选绘本列表
     *
     * @param language 语言类型
     * @return 可选绘本列表
     */
    List<SelectableBookRespVO> getSelectableBooks(String language);

    /**
     * 获取可选绘本集列表
     *
     * @param language 语言类型
     * @return 可选绘本集列表
     */
    List<BookSetSelectableRespVO> getSelectableBookSets(String language);

    /**
     * 获取绘本集内的绘本列表
     *
     * @param bookSetId 绘本集ID
     * @return 绘本列表
     */
    List<SelectableBookRespVO> getBooksByBookSetId(Long bookSetId);

    // =============================================
    // 辅助方法
    // =============================================

    /**
     * 获取作业信息
     *
     * @param assignmentId 作业ID
     * @return 作业信息
     */
    ClassAssignmentDO getAssignment(Long assignmentId);

    /**
     * 检查用户是否有权限操作作业
     *
     * @param assignmentId 作业ID
     * @param userId       用户ID
     * @return 是否有权限
     */
    boolean hasAssignmentPermission(Long assignmentId, Long userId);

    /**
     * 检查用户是否为作业所属班级的成员
     *
     * @param assignmentId 作业ID
     * @param userId       用户ID
     * @return 是否为班级成员
     */
    boolean isAssignmentClassMember(Long assignmentId, Long userId);

    // =============================================
    // 作业未完成情况管理
    // =============================================

    /**
     * 获取作业未完成的学生列表
     *
     * @param assignmentId 作业ID
     * @param userId       当前用户ID
     * @return 未完成作业的学生列表
     */
    List<IncompleteStudentRespVO> getIncompleteStudents(Long assignmentId, Long userId);

    /**
     * 获取学生的未完成作业列表
     *
     * @param classId 班级ID
     * @param userId  当前用户ID
     * @return 学生未完成作业列表
     */
    List<IncompleteAssignmentRespVO> getStudentIncompleteAssignments(Long classId, Long userId);

    /**
     * 获取班级作业汇总统计
     *
     * @param classId 班级ID
     * @param userId  当前用户ID
     * @return 班级作业汇总统计
     */
    ClassAssignmentSummaryRespVO getClassAssignmentSummary(Long classId, Long userId);

    /**
     * 获取逾期作业列表
     *
     * @param classId 班级ID
     * @param userId  当前用户ID
     * @return 逾期作业列表
     */
    List<AssignmentRespVO> getOverdueAssignments(Long classId, Long userId);

    /**
     * 获取作业关联的班级列表
     *
     * @param assignmentId 作业ID
     * @param userId       当前用户ID
     * @return 班级列表
     */
    List<AssignmentClassRespVO> getAssignmentClasses(Long assignmentId, Long userId);

}
